package com.edu.d8_threadPool;

import java.util.concurrent.*;

/**
 目标：自定义一个线程池对象，并测试其特性。
 */
public class ThreadPoolDemo1 {
    public static void main(String[] args) {
        // 1、创建线程池对象
        /**
         public ThreadPoolExecutor(int corePoolSize,
         int maximumPoolSize,
         long keepAliveTime,
         TimeUnit unit,
         BlockingQueue<Runnable> workQueue,
         ThreadFactory threadFactory,
         RejectedExecutionHandler handler)
         */
        ExecutorService pool = new ThreadPoolExecutor(3, 5 ,
                6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5) , Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy() );

        // 2、给任务线程池处理。实现Runable()接口，重写run方法，创建一个任务对象
        Runnable target = new MyRunnable();
        //将任务对象交给线程池进行处理，线程池会自动创建一个新线程，自动处理线程任务，是自动执行的。
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);

        //创建临时线程的时机，当新任务提交时，发现此时，所有的核心线程都在忙，等待的任务队列也满了，这个时候就会创建新的临时线程
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);

        // 创建临时线程
        pool.execute(target);
        pool.execute(target);
        //当核心线程在忙，等待的任务队列也满了，临时线程也都在忙，此时，又有新的任务来了
        //就会触发中止策略，开始拒绝新的任务
//        // 不创建，拒绝策略被触发！！！
//        pool.execute(target);

        // 关闭线程池（开发中一般不会使用）。
        // pool.shutdownNow(); // 立即关闭，即使任务没有完成，会丢失任务的！
        pool.shutdown(); // 会等待全部任务执行完毕之后再关闭（建议使用的）
    }
}
